<?php

/**
 * @author Grover Campos
 * @version 1.0
 * @created 03-ago-2009 06:43:07 p.m.
 */
class Gtux_Model_Gateway_Formulario extends Gtux_Model_Gateway_Abstract 
{
  
  /**
   * Devuelve la tabla
   *
   * @return Gtux_Model_Table_Formulario
   */
  public function getDbTable()
	{
    if (null == $this->_dbTable) 
    {
      $this->setDbTable('Gtux_Model_Table_Formulario');
    }
    return $this->_dbTable;
	}

	/**
	 * 
	 * @param Gtux_Model_Formulario $formulario
	 * @return int
	 */
	public function delete(Gtux_Model_Abstract $formulario)
	{
    $where = $this->getDbTable()
                  ->getAdapter()
                  ->quoteInto('id_formulario = ?', $formulario->getIdFormulario());
    return $this->getDbTable()->delete($where);
	}

	/**
	 * (non-PHPdoc)
	 * @see library/Gtux/Model/Gateway/Gtux_Model_Gateway_Abstract#fetchAll()
	 * @return array
	 */
	public function fetchAll()
	{
    $rs      = $this->getDbTable()->fetchAll();
    $entries = array();
    foreach ($rs as $row) 
    {
      $entries[] = new Gtux_Model_Formulario(null, $row);
    }
    return $entries;
	}

	/**
	 * 
	 * @param Gtux_Model_Formulario $formulario
	 * @return int
	 */
	public function insert(Gtux_Model_Abstract $formulario)
	{
	  $data = array(
	    'nombre'         => $formulario->getNombre(),
	    'nombre_tabla'   => $formulario->getNombreTabla(),
	    'visible'        => $formulario->getVisible(),
	    'locked'         => $formulario->getLocked(),
	    'etiqueta'       => $formulario->getEtiqueta(),
	    'created_at'     => $formulario->getCreatedAt()->toString(Zend_Date::ISO_8601),
	    'id_user'        => $formulario->getIdUser()
	  );
	  $id = $formulario->getIdFormulario();
	  if (NULL == $id) 
	  {
	  	return $this->getDbTable()->insert($data);
	  }
    else
    {
      $this->_logger->err('Se intento insertar un formulario con id');
      throw new Zend_Db_Exception('Se intento insertar un formulario con id');
    }
	}

	/**
	 * Update formulario
	 * @see library/Gtux/Model/Gateway/Gtux_Model_Gateway_Abstract#update($model)
	 */
	public function update(Gtux_Model_Abstract $formulario)
	{
	  $data = array();
	  if (strlen($formulario->getNombre())>0) 
	  {
	  	$data['nombre'] = $formulario->getNombre();
	  }
	  if (strlen($formulario->getNombreTabla())>0) 
	  {
	  	$data['nombre_tabla'] = $formulario->getNombreTabla();
	  }
	  if (null !== $formulario->getVisible()) 
	  {
	  	$data['visible'] = $formulario->getVisible();
	  }
	  if (null !== $formulario->getLocked()) 
	  {
	  	$data['locked'] = $formulario->getLocked();
	  }
	  if (strlen($formulario->getEtiqueta())>0) 
	  {
	  	$data['etiqueta'] = $formulario->getEtiqueta();
	  }
	  $id = $formulario->getIdFormulario();
	  if (null !== $id && sizeof($data)>0) 
	  {
      $where = $this->getDbTable()
                    ->getAdapter()
                    ->quoteInto('id_formulario = ?', $formulario->getIdFormulario());
                    
      return $this->getDbTable()->update($data, $where);
	  }
    else
    {
      $this->_logger->err('Se intento actualizar un formulario sin id');
      throw new Zend_Db_Exception('Se intento actualizar un formulario sin id');
    }
	}

  /**
   * 
   * @see Gtux_Model_Gateway_Abstract::save()
   *
   * @param Gtux_Model_Abstract $model
   */
  public function save(Gtux_Model_Abstract $formulario)
  {
    $id = $formulario->getIdFormulario();
    if (NULL == $id) 
    {
      $db = $this->getDbTable()->getAdapter();
      $db->beginTransaction();
      $flg = true;
      
      try
      {
        $id = $this->insert($formulario);
        $formulario->setIdFormulario($id);
        // si el formulario no tiene un subformulario, le creo uno por defecto
        if ($formulario->getSubformularios()->count() == 0)
        {
          $subformulario = new Gtux_Model_Subformulario();
          $subformulario->setNombre('');
          $subformulario->setEtiqueta('');
          $subformulario->setFormulario($formulario);
          $subformulario->setUser($formulario->getUser());
          $formulario->addSubformulario($subformulario);
        }
        $subforms = $formulario->getSubformularios();
        $subformulario = null;
        foreach ($subforms as $subformulario)
        {
          $subformulario->setIdFormulario($id);
          $flg    &= (bool)$subformulario->save();
        }
      
        if ($flg)
        {
          $db->commit();
          return true;
        }
        else
        {
          $db->rollBack();
          $this->_logger->err('Error al guardar el formulario');
          return false;
        }
      }
      catch (Exception $e)
      {
        $db->rollBack();
        $this->_logger->err($e->getMessage());
        return false;
      }
    }
    else 
    {
      return $this->update($formulario);
    }    
  }
  
  /**
   * Busca un formulario
   * 
   * @param int $id
   * @param Gtux_Model_Formulario $model
   */
  public function findRecursive ($id, Gtux_Model_Formulario $model, $recursive = true)
  {
    $row = parent::find($id, $model);
    if ($recursive) 
    {
      $subformulariosRow = $row->findDependentRowset('Gtux_Model_Table_Subformulario');
      if ($subformulariosRow->count() > 0) 
      {
        foreach ($subformulariosRow as $subformularioRow) 
        {
          $subformulario = new Gtux_Model_Subformulario(null, $subformularioRow);
          $model->addSubformulario($subformulario);
        };
      }
    }
  }
  
  public function inicializarDeTabla($tabla, Gtux_Model_Formulario $formulario) 
  {
    $tabla_info = $formulario->getDbConn()->describeTable($tabla);
  }
}
?>